#include<bits/stdc++.h>
using namespace std;
struct node{
    int l,r;
}nn[100002];
int p[100002];
int LL[1000002];
bool cmp(node a,node b){
    if(a.l==b.l)return a.r<b.r;
    else return a.l<b.l;
}
node ans[100002];
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int T;
    cin>>T;
    for(int QwQ=1;QwQ<=T;QwQ++){
        int n,m,L,V;
        cin>>n>>m>>L>>V;
        int ni=0;
        for(int i=1;i<=n;i++){
            int d,v,a;
            scanf("%d%d%d",&d,&v,&a);
            if(a==0){
                if(v>V){
                    ni++;
                    nn[ni].l=d;
                    nn[ni].r=L;
                }
            }
            else{
                double t;
                if(a>0){
                    int x;
                    if(v>V)x=d;
                    else{
                        double t=(1.0*(V+0.0001-v)/a);
                        x=ceil(t*v+t*t*a/2)+d;
                        
                    }
                    ni++;
                    nn[ni].l=x;
                    nn[ni].r=L;
                }
                else {  //a<0
                    if(v>V){
                        double t=(1.0*(V+0.0001-v)/a);
                        int x=floor(t*v+t*t*a/2)+d;
                        ni++;
                        nn[ni].l=d;
                        nn[ni].r=min(x,L);
                    }
                }
            }
        }
        for(int i=1;i<=m;i++)cin>>p[i];
        int mmm=1;
        for(int i=1;i<=L+1;i++){
            LL[i]=mmm;
            if(p[mmm]==i){
                mmm++;
            }
        }

        // for(int i=1;i<=ni;i++)cout<<nn[i].l<<' ';
        // cout<<endl;
        // for(int i=1;i<=ni;i++)cout<<nn[i].r<<' ';
        // cout<<endl;
        // for(int i=1;i<=L+1;i++)cout<<LL[i]<<' ';
        // cout<<endl;

        for(int i=1;i<=ni;i++){
            nn[i].l=LL[nn[i].l];
            nn[i].r=LL[nn[i].r+1];
        }
        
        // for(int i=1;i<=ni;i++)cout<<nn[i].l<<' ';
        // cout<<endl;
        // for(int i=1;i<=ni;i++)cout<<nn[i].r<<' ';
        // cout<<endl;

        int read=0;
        for(int i=1;i<=ni;i++){
            if(nn[i].l==nn[i].r){
                nn[i].l=1;
                nn[i].r=L;
            }
            else{
                nn[i].r--;
                read++;
            }
        }
        cout<<read<<' ';
        // cout<<endl;
        // for(int i=1;i<=ni;i++)cout<<nn[i].l<<' ';
        // cout<<endl;
        // for(int i=1;i<=ni;i++)cout<<nn[i].r<<' ';
        // cout<<endl;

        sort(nn+1,nn+ni+1,cmp);
        int ansn=1;
        ans[1]=nn[1];
        for(int i=2;i<=ni;i++){
            if(nn[i].l!=ans[ansn].l){
                if(nn[i].l<=ans[ansn].r){
                    ans[ansn].l=max(nn[i].l,ans[ansn].l);
                    ans[ansn].r=min(nn[i].r,ans[ansn].r);
                }
                else{
                    ansn++;
                    ans[ansn]=nn[i];
                }
            }
            
        }
        // cout<<endl;
        // for(int i=1;i<=ansn;i++){
        //     cout<<ans[i].l;
        // }
        // cout<<endl;
        // for(int i=1;i<=ansn;i++){
        //     cout<<ans[i].r;
        // }
        // cout<<endl;
        cout<<m-ansn<<endl;
        for(int i=1;i<=L;i++){
            LL[i]=0;
        }
    }
    return 0;
}